約 4,275,728 件
https://w.atwiki.jp/projecthikky/pages/28.html
コード帳 BASIC BASIC系言語なら何でもOK 例 ActiveBASIC DarkBASIC F-BASIC N-BASIC N88-BASIC MSX-BASIC QuickBASIC QBasic サターンBASIC ファミリーベーシック など N88-BASIC - Hello World
https://w.atwiki.jp/abwiki/pages/60.html
N88BASIC互換性について PC8801とかのようにOSなんてものがROM-BASICとゴチャ混ぜ状態だったころのようなあの時代には戻れません。 以下にABのN88BASIC互換性のポイントを挙げる ダイレクトモードは無い 各種コマンドは無い。SAVE,LOAD,LIST,RUNはもちろんAUTO,KEYも無い。 READ,DATA関連は無い 変数はDimで明記しなければならない ON 〇〇 GOTO/GOSUB関連も存在しない SCREEN 3,0,0,1 CONSOLE ,,0,1 DEFINT A-Z CLS 3←CLSしか無い テキスト、グラフィックの重ね合わせはできない。 BEEP(0) BEEP(1)でブザーを作ることはできない。 関数は大文字小文字を区別する(ABSはAbs、ASCはAscとなる) このようなワケで、N88BASICのプログラムを移植するときは苦労します。 画面サイズの変更 Sub N88SIZE(w As Long, h As Long)Dim wrc As RECT, crc As RECTDim ps[1] As POINTAPIGetWindowRect(_PromptSys_hWnd, wrc)GetClientRect(_PromptSys_hWnd, crc)ps[0].x=crc.left ps[0].y=crc.topps[1].x=crc.right ps[1].y=crc.bottomClientToScreen(_PromptSys_hWnd,ps[0])ClientToScreen(_PromptSys_hWnd,ps[1])crc.left=ps[0].x crc.top=ps[0].ycrc.right=ps[1].x crc.bottom=ps[1].yps[0].x = (crc.left-wrc.left) + (wrc.right-crc.right)+wps[0].y = (wrc.bottom -crc.bottom) + (crc.top-wrc.top)+hSetWindowPos(_PromptSys_hWnd,0,0,0,ps[0].x, ps[0].y, SWP_NOMOVE)End Sub ウェイト ループによるウェイトは速度の問題から使えません。 Sleep()で対処するか、Time$を使うなどして下さい。 Sub WAIT()Dim i$ As StringDim j$ As Stringi$=Time$() j$=Time$()While i$=j$j$=Time$()WendEnd Sub 対応表 ○=ABに存在し互換性がある △=ABに存在するが利用に注意が必要 ×=ABに存在しない ○ ABS ○ ASC ○ ATN × ATTR$ × AUTO △ BEEP × BLOAD × BSAVE × CALL ○ CDBL × CHAIN ○ CHR$ ○ CINT △ CIRCLE × CLEAR ○ CLOSE △ CLS × COLOR × COMMON × CONSOLE × CONT × COPY ○ COS ○ CSNG × CSRLIN × CVD × CVI × CVS × DATA △ DATE$ △ DEF FN × DEF USR × DEFDBL × DEFINT × DEFSNG × DEFSTR × DELETE △ DIM × DSKF × DSKI$ × DSKO$ × EDIT ○ END ○ EOF × ERASE × ERL × ERR × ERROR ○ EXP △ FIELD × FILES ○ FIX × FN ○ FOR~NEXT × FORMAT × FPOS × FRE △ GET × GET@ ○ GOSUB ○ GOTO × HELP ON/OFF/STOP ○ HEX$ ○ IF~THEN~ELSE △ INKEY$ × INP △ INPUT △ INPUT$ △ INPUT# ○ INSTR ○ INT × KEY × KEY LIST × KEY ON/OFF/STOP ○ KILL ○ LEFT$ ○ LEN ○ LET × LFILES △ LINE × LINE INPUT × LINE INPUT# × LIST × LLIST × LOAD ○ LOC ○ LOCATE ○ LOF ○ LOG × LPOS × LPRINT × LSET × MERGE △ MID$ × MKD$ × MKI$ × MKS$ × MON × MOTOR × NAME × NEW × NEW ON ○ OCT$ × ON ERROR GOTO × ON HELP GOSUB × ON KEY GOSUB × ON STOP GOSUB × ON TIME$ GOSUB × ON~GOSUB × ON~GOTO △ OPEN × OPTION BASE × OUT × PAINT × PEEK × POINT × POKE × POS(0) × PRESET △ PRINT ○ PSET △ PUT × PUT@ △ RANDOMIZE × READ ○ REM × RENUM × RESTORE × RESUME ○ RETURN ○ RIGHT$ ○ RND × ROLL × RSET × RUN × SAVE × SCREEN × SEARCH × SET ○ SGN ○ SIN ○ SPACE$ ○ SQR × STOP × STOP ON/OFF/STOP ○ STR$ ○ STRING$ × SWAP ○ TAN ○ TIME$ × TIME$ ON/OFF/STOP × TROFF × TRON ○ VAL × VIEW × WAIT ○ WHILE~WEND × WIDTH × WIDTH PRINT × WINDOW △ WRITE
https://w.atwiki.jp/abwiki/pages/355.html
継承とは誰かが作ったクラスを受け継ぐことです。技術の伝承です。 コンポジションは誰かが作ったクラスを取り入れるです。合成とか層化とかいいます。 この2つはよくis-aとかhas-aといった区別をします。 簡単に言えば 親クラスのすべてが子クラスに適用できるなら継承、 子クラスが親クラスを包含している場合や親クラスの一部を使いたいときはコンポジションを使うべきです。 この親子関係は大変ややこしいので、次のように子クラスから親クラスを求めることがあります。 ABのコントロール(スタチックとかエディットボックスとか)を簡単に扱うクラスがほしい! このときこれらコントロールに共通する部分を抜き出します。 すると… コントロールはすべてウインドウハンドルを持っている コントロールはすべてキャプションを持っている コントロールはすべて可視/不可視状態を設定できる コントロールはすべてリサイズ可能である …といった共通部分があります。(他にもあります) これらを親クラスにもたせ、それ以外は子クラスに持たせます。 リストボックスなら特定のアイテムが選択されたとか、チェックボックスなら選択状態とか。 このような子クラスから親クラスを作る方法を汎化(または抽象化)などと言うらしいです。 まあ、N88BASICのころから当たり前のようにやってきたことをクラスとか継承なんてカッコつけてるだけですけどね! 継承とオーバーロード C++ではオーバーロードは自分の中だけで機能します。 子クラスで親クラスの関数をオーバーロードすることはできません。。。 しかしABではオーバーロードできます。C++厨は気をつけてくださいね。C++使う人がABを使わないか… #N88BASICClass BPublic Sub x(i As Long)Print "B x"End SubEnd ClassClass DInherits BPublic Sub x(d As Double)Print "D x"End SubEnd ClassDim d As Dd.x(555)'"D x"d.x(12.354)'"B x"
https://w.atwiki.jp/tianlang/pages/21.html
Gmailのように「shift + クリック」でチェックボックスの複数選択を可能にするjQueryプラグイン Gmailはチェックボックスを複数一気に選択したいときに先頭をまずクリックして、次に最後のチェックボックスを【シフト+クリック】するとその間にあるチェックボックスが一気に選択できて非常に便利なのですが、それをjQueryプラグインで実現するには以下のようにします。 ■ 1.jQueryをダウンロード http //jquery.com/ [^] からjQueryをダウンロードします。(ダウンロードしたファイル名を jquery.js とします。) ■ 2. jQuery Field Plug-inをダウンロード http //www.pengoworks.com/workshop/jquery/field/field.plugin.htm [^] から【jquery.field.js】をダウンロードします。 ■ 3. 以下のようなチェックボックスを含むhtmlを用意します form action="" method="post" input type="checkbox" name="user_id" id="chkRange_1" value="1" / label for="chkRange_1" Option 1 /label input type="checkbox" name="user_id" id="chkRange_2" value="2" / label for="chkRange_2" Option 2 /label input type="checkbox" name="user_id" id="chkRange_3" value="3" / label for="chkRange_3" Option 3 /label input type="checkbox" name="user_id" id="chkRange_4" value="4" / label for="chkRange_4" Option 4 /label input type="checkbox" name="user_id" id="chkRange_5" value="5" / label for="chkRange_5" Option 5 /label /form ■ 4. 用意したhtmlのヘッダに以下の記述を追加 ( j$ としているのはprototype.js とのコンフリクト回避のためです。) script type="text/javascript" src="jquery.js" /script script type="text/javascript" src="jquery.field_j.js" /script script jQuery.noConflict(); var j$ = jQuery; j$(document).ready( function (){ j$( input[@name="user_id"] ).createCheckboxRange(); } ); /script 以上で「シフト+クリック」による複数選択が実行できます。 便利。 No.591 03/10 16 30 jQuery 最も簡単な画像のロールオーバー導入方法 ■ jQuery用プラグイン jQuery_auto を使用します。 prototype.js とのコンフリクト解消版 jquery_auto はこちらからダウンロード↓ http //logic.stepserver.jp/data_other/jquery_auto_j.zip [^] ■ 1. scriptファイルを読み込ませます script type="text/javascript" src="js/lib/jquery.js" /script script type="text/javascript" src="js/lib/jquery_auto_j.js" /script ■ 2. ロールオーバー画像ファイル名の最後に _over をつける。 例: 【image.gif】 の場合 【image_over.gif】 ■ 3. HTMLの<img>タグに属性 class="Hover" を追加する img src="image.gif" ↓ img src="image.gif" class="Hover" 以上の手順で完了。 簡単です。 参考:http //sputnik.pl/code/javascript/jquery_auto [^] No.579 12/29 17 48 prototype.js jQuery del.icio.us風タグメニューを実装するjQueryプラグイン 「tagto」 del.icio.us風タグメニューを実装するjQueryプラグインがなかなか便利です。日本語タグもOK(UTF-8, euc-jp) ■ tagto http //realazy.org/projects/tagto/ [^] ■ コード例( j$ としてprototype.js とのコンフリクトを回避しています) script type="text/javascript" src="js/lib/jquery-1.2.1.pack.js" /script script type="text/javascript" src="js/lib/jquery.tagto.js" /script link type="text/css" rel="stylesheet" href="js/lib/jquery.tagto.css" / script type="text/javascript" /* prototype.js とのコンフリクト回避 */ jQuery.noConflict(); var j$ = jQuery; j$(document).ready(function(){ j$( #tag_area ).tagTo( #tag_name , , , tag_selected ); }); /script /head body h2 del.icio.us 風タグのDemo /h2 div input type="text" id="tag_name" name="tag_name" /div strong Tags /strong div id="tag_area" # # # # # # /div /body /html No.568 11/15 14 50 jQuery jQuery , prototype.js 用「ツールチップ(吹き出し説明)」表示ライブラリ 「ツールチップ」とはオンマウス時に表示される画像やテキストのことです。 Windows IEで画像の上にマウスを置いてしばらく待つとALT属性が見えるというアレですね。 これを簡単に実装するライブラリを紹介。jQuery、prototype.js プラグインで探してみました。 ■ tooltip.js ( 要prototype.js ) http //blog.innerewut.de/tooltip [^] おすすめ! 導入が簡単でわかりやすい。 ツールチップとして表示させたい内容をhtmlで記述できるのでカスタマイズが簡単 ■ cooltips ( 要prototype.js , script.aculo.us ) http //www.wildbit.com/labs/cooltips/ [^] フェードエフェクトで出現するツールチップ ツールチップ枠のデザインはあらかじめ用意されたものを使用することになりそう…。 ■ jTip A jQuery Tool Tip ( 要 jQuery ) http //www.codylindley.com/blogstuff/js/jtip/ [^] Ajaxで動的にツールチップの中身を読み込んで表示します。 日本語テキストを扱うにはハックする必要がありそう…。 ツールチップ枠のデザインはあらかじめ用意されたものを使用することになりそう…。 ■ jQuery plugin Tooltip ( 要 jQuery ) http //bassistance.de/jquery-plugins/jquery-plugin-tooltip/ [^] title属性やファイル名をツールチップとして表示させるというライブラリ。 オンマウスになった瞬間に表示されます。 ■ Flash Tooltips Using jQuery ( 要 jQuery ) http //ioreader.com/2007/05/15/flash-tooltips-using-jquery/ [^] Flashを使ったツールチップ 少し重い その他 jQueryライブラリはこちらで取り上げられてます http //coliss.com/articles/build-websites/operation/javascript/356.html [^] No.564 01/17 16 40 jQuery prototype.js jQuery html()メソッドと DOM.innerHTML の違い 例えば id="hogehoge" の中身を書き換えるには ■ prototype.js + DOM の場合 var mytext= aiueo ; $( hogehoge ).innerHTML=mytext; ■ jQueryの場合 var mytext= aiueo ; j$("#hogehoge").html(mytext); と書けますが、このとき var mytext=0; $( hogehoge ).innerHTML=mytext; // 0 が表示される j$("#hogehoge").html(my); // 何も表示されない という違いがあるようなので注意! No.553 09/07 18 17 prototype.js jQuery window.onload 前でも DOM 処理が可能なら通知してくれる domready.js JavaScriptでDOM操作を行うときはDOMツリーの完成を待ってから処理を行う必要があるため window.onload を待って処理を行う必要があります。 しかし window.onload は全てのファイルの読み込み完了時に発生するイベントなので、DOMツリーの完成だけを待っている場合画像の読み込み等も待たなくてはならず、無駄が生じます。 そこでDOMツリーの完成を待つイベントを発生させるライブラリ domready.js ↓ [window.onload 前でも DOM 処理が可能なら通知してくれる domready.js - METAREAL](http //weblog.metareal.org/2007/07/10/domready-js-cross-browser-ondomcontentloaded/) [^] ちなみに jQuery では **$(document).ready()** で実装されています。 例: $(document).ready(function(){ alert( DOMツリーの読み込みが完了しました ); }); 参考:[jQueryコア ready event at jQuerist](http //jquerist.com/core-of-jquery-ready-event) [^] prototype.js Version 1.6 で ** contentloaded** というメソッドで実装される予定 No.550 08/31 16 20 DOM jQuery prototype.js jQuery と prototype.js を同時に使う。($(); のコンフリクト回避) jQueryとprototype.js を同時に使いたい場面がまれにあります。 そのとき $( id_name ); といった書式を jQuery, prototype.js 共に持っているのですが、その動作(書式や戻り値)が違います。 例えば戻り値の場合、 prototype.js:DOMオブジェクトを返す jQuery:jQueryオブジェクトを返す という違いがあります。 そこで jQueryとprototype.jsを同時に使いたい場合は jQueryの $(); を違う名前に変更して使います。 html head script src="prototype.js" /script script src="jquery.js" /script script jQuery.noConflict(); var j$ = jQuery; /script /head body /body /html 真ん中の2行を追加します。 こうすることによって jQuery jQuery(); j$(); prototype.js $(); として使用できます No.499 09/08 12 45 jQuery prototype.js javascriptでXpath。jQueryを使ってDOM操作を行う Xpathを記述できるフレームワークとして jQueryという便利なフレームワークがあります。例えば「 #wrapper というIDを持つDIVの中の #menuというIDを持つDIVの中の Aタグの中のIMGタグ」のオブジェクトが1行で取得できます。では早速使ってみます。 ■ 使い方 1. jQueryページhttp //jquery.com/ [^]から「Download jQuery (compressed) 19kb」をダウンロードする 2. ダウンロードしたファイルを任意のパスにコピーし読み込ませる ■ prototype.js とのコンフリクト回避 script jQuery.noConflict(); var j$ = jQuery; /script でコンフリクトを回避しておきます。 ■ ID, クラス名, タグ名による指定 jq_obj=j$("#hogehoge"); jq_obj=j$(".hogeclass"); jq_obj=j$("div"); ■ こんな指定も出来ます 同ページ内へのリンクを抽出してその name="" を抜き出す j$( a[@href*="#"] ).each(function(){ p = this.href.split( # ); name=p[1]; alert(name); }); ■ サンプルソース 下記リンクをクリックしてソースを表示させて下さい サンプルソース1の実行 サンプルソース2の実行 サンプルソース3の実行 ■ jQueryを使うコツ jQueryを使うコツは基本的に全てjQueryオブジェクトを返します。 (prototype.jsとここが違うので注意) DOMオブジェクトを返したいときは get() メソッドを使用します。 コーディング例:クラス名が icon_on の<a>タグの中の<img>タグを取得する jq_obj=$("a[@class=icon_on]/img", $target); // jQueryオブジェクトを返す。 dom_obj=$("a[@class=icon_on]/img", $target).get(0); // DOMオブジェクトを返す。 jQuery 開発者向けメモ 参考: http //www.mikage.to/jquery/jquery_basic.html [^] ↑参考URL:http //logic.stepserver.jp/memo.cgi/category/3/tag/jQuery/ [^]
https://w.atwiki.jp/abwiki/pages/158.html
自然数eを底とする指数関数。 指数関数は級数展開で求めることができる。x 0 である時は、級数展開の各項に正負が交互に現れるため桁落ちが生じる。そこで、指数関数の逆数を計算することによりx 0の計算に直す。 収束を早めるため、x=t+k*ln(x), -ln(x)/2 x ln(x)/2 となるtとkを求め、Exp(x)=Exp(t)*2^kとする。 このほかに、連分数を使って求める方法もある。 ActiveBasicでは級数展開を用いたアルゴリズムでExp関数が用意されている。 #N88BASICConst LOG2 = 0.6931471805599453094172321214581765680755'log_e(2)Function lldexp(x As Double, k As Integer) As DoubleDim w As DoubleIf k = 0 Thenw = 2Elsew = 0.5k = -kEnd IfWhile kIf k And 1 Then x = x * ww = w * wk = k 1Wendlldexp = xEnd FunctionFunction lexp1(x As Double) As Double' 級数展開にて求めるDim i As Integer, k As Integer, neg As IntegerDim a As Double, e As Double, prev As DoubleIf x = 0 Thenk = x / LOG2 + 0.5' またはFix(x / LOG2 + 0.5)Elsek = x / LOG2 - 0.5' またはFix(x / LOG2 - 0.5)End Ifx = x - k * LOG2' 級数展開If x = 0 Thenneg = 0Elseneg = 1x = -xEnd Ife = 1 + xa = xi = 2Doprev = ea = a * x / ie = e + ai = i + 1Loop While e prevIf neg Then e = 1 / elexp1 = lldexp(e, k)End FunctionConst N = 22' 本文参照 (6, 10, 14, 18, 22, 26, ...)Function lexp(x As Double) As Double' 連分数展開にて求めるDim i As Integer, k As IntegerDim x2 As Double, w As DoubleIf x = 0 Thenk = x / LOG2 + 0.5' またはFix(x / LOG2 + 0.5)Elsek = x / LOG2 - 0.5' またはFix(x / LOG2 - 0.5)End Ifx = x - k * LOG2'連分数展開x2 = x * xw = x2 / NFor i = N - 4 To 6 Step -4w = x2 / (w + i)Next ilexp = lldexp((2 + w + x) / (2 + w - x), k)End Function'Dim i As IntegerDim x As DoubleFor i = -10 To 10x = i / 4.0Print "exp("; x; Ex"* log(2))\t"; lexp1(LOG2 * x); lexp(LOG2 * x), Exp(LOG2 * x)Next i
https://w.atwiki.jp/abwiki/pages/77.html
エディットボックスについて † エディットボックスは文字や数字を入力できるコントロール 作られた直後は32KBまで編集可能 EM_SETLIMITTEXTメッセージを使うと最大で2GBか4GBまで増やせるが、9x系のOSだと64KBまでという制限がある エディットボックスのスタイル † RADで変更できるエディットボックスのスタイルについて 無効(使用不可) 入力エリアが灰色になって入力フォーカスを受け付けないが、Set、GetWindowTextは普通に使える 可視 チェックしておかないとエディットボックスが見えない グループ グループボックス?を参照 タブストップ 加筆plz 複数行 複数行のテキストが扱えるようになる 水平スクロールバー、垂直スクロールバー、垂直オートスクロールのスタイルが使用可能になる パスワードスタイルは使えない 番号 数字以外入力できなくなる 水平スクロールバー エディットボックスの下端にスクロールバーが出る 右端を越えようとすると勝手にスクロールする 水平オートスクロール 右端を越えようとすると勝手にスクロールするが、スクロールバーは表示されない 垂直スクロールバー エディットボックスの右端にスクロールバーが出る 下端を越えようとすると勝手にスクロールする 水平オートスクロール 下端を越えようとすると勝手にスクロールするが、スクロールバーは表示されない パスワード 文字を入力すると*表示になり変換キーが使えなくなる このスタイルだけはウィンドウを作った後に変更できない 常に選択を表示 エディットボックス内で文字を選択している時、フォーカスを失うと通常は選択エリアは表示されなくなるが これがチェックされていると選択範囲が表示されたままになる OEM変換 たぶんANSI文字セットで入力された文字がOEM文字セットに変換されてるんだと思う 改行を許可 ENTERによる改行を許可する。 ダイアログボックスにデフォルトのボタンが付いている場合、ENTERを押すとそっちのボタンを押してしまう…らしいが チェックしてなくとも複数行スタイルがチェックされてればENTERで改行できる。謎。 ABのダイアログボックスは擬似的な物だからだと思う。 本当のダイアログボックスでデフォルトのボタンが付いてた場合、Enterを押すとボタンが押されるはずだ。 それを解除し、Enterで改行を許可するかどうかを決めるプロパティがこれ。 大文字変換/小文字変換 そのまんま 読み取り専用 無効に似ているがフォーカスが当たる。コピーなどの操作が可能 テキストの配置 そのまんま ↑ [edit] 操作サンプル † 以下の例では特に記述が無ければhEditBoxはエディットボックスのハンドルを示す またSendMessage以外の関数を用いる方法は他のアプリケーションが持つウィンドウに使用することはできない ↑ [edit] 現在の文字数を取得する † 方法1 return = GetWindowTextLength(hEditBox) 方法2 return = SendMessage(hEditBox,WM_GETTEXTLENGTH,0,0) どちらの方法でもreturnに文字数が入る ↑ [edit] テキストを設定する † 方法1 SetWindowText(hEditBox,Buffer) 方法2 SendMessage(hEditBox,WM_SETTEXT,0,Buffer) Bufferはセットしたい文字列の先頭のポインタを示すBytePtr型の変数 もしくはString型変数をStrPtrに渡した戻り値 ↑ [edit] テキストを取得する † 例としてエディットボックスの文字列を全て取得してみる Dim Buffer As BytePtr Dim Length As Long Length = GetWindowTextLength(hEditBox) Buffer = calloc(Length+1) GetWindowText(hEditBox,Buffer,Length+1) MessgaeBox(hEditBox,Buffer,NULL,MB_OK) free(Buffer) 多少注意が必要な点があります 文字列の長さはLengthの値で合っていますが、GetWindowTextは文字列の終端にNULL文字( H00)を書き込もうとする為 必要なバッファが1バイト多くなってしまいます この状態でLengthをそのまま使うと尻が切れてしまうので、Length+1にして修正しています callocの引数も+1している事にも注意して下さい それが無いとヒープエラー出ます またGetWindowTextの所は SendMessage(hEditBox,WM_GETTEXT,Length+1,Buffer) で代用可能です ↑ [edit] 元に戻す処理 † SendMessage(hEditBox,WM_UNDO,0,0) ただし元に戻せるのは1回だけ ↑ [edit] 切り取り/コピー/貼り付け処理 † 上から順に切り取り、コピー、ペースト処理。それ以外特に書くことは無い。 SendMessage(hEditBox,WM_CUT,0,0) SendMessage(hEditBox,WM_COPY,0,0) SendMessage(hEditBox,WM_PASTE,0,0)
https://w.atwiki.jp/abwiki/pages/236.html
Basic言語でDLLを作るだって?冗談言うなよ! それが、ActiveBasicでは自然な形で作れてしまいます。ネイティブ コードにコンパイルされるため、DLLプログラムとして要求されるだけの実行速度、プログラム サイズが期待できます。 作り方はとてもシンプル 通常のEXEプログラムと違う点は以下の2つだけ。 ① プロジェクト作成時に「DLL」を選択する ② エクスポートする関数には "Export" 指定をする ①は画面の説明に従うだけなので解説の必要はありませんね。②に関してですが、今までは関数を定義するというと、 Sub func1(parm...) ... End Sub Function func2(oarm...) As Long ... End Sub という感じに定義するのに対し、エクスポートする関数に関しては、 Sub Export func1(parm...) ... End Sub Function Export func2(oarm...) As Long ... End Sub などと、"Sub/Function" の後に "Export" という指定をしましょうということです。エクスポートとは、外部プログラムから呼び出すことができる関数のことです。例えば、func1という関数をエクスポートし、test.dllを作成すると、 Declare Sub func1 Lib "test.dll" (parm...) というように、外部プログラム(EXEやDLL)からの呼び出しが可能になります。 実際にDLLを作ってみよう DLLの利点は、なんといっても汎用性の高いプログラムを様々なアプリケーション プログラムから共有する形で呼び出すことができることにつきます。そこで、今回は2つの役立ちそうな機能(関数)をDLL化してみたいと思います。 GetFileDlg … OPENFILENAME構造体の初期化、GetOpenFileName/GetSaveFileName関数の呼び出し GetFolderDlg … GetFileDlgにちなんで、フォルダ(ディレクトリ)パスを取得するためのダイアログボックスを表示するプログラムをまとめる まずは、プロジェクトの作成から。プロジェクト名を "FileDlg" などとし、タイプを "DLL" にします。プロジェクト オプションなどの設定は特に必要ありません。 プロジェクトの作成はできたでしょうか?ここから皆さんが扱うファイルは、FileDlg.sbp のみになります。このファイルに関数郡を定義していくのですが、なにやら、初期状態ですでにDllMainといった関数が定義されています。これはDLLのロードやスレッド開始、終了などの処理を記述するための特別な関数ですが、めったなことではいじりませんので、ほっときましょう。そのDllMain関数の下に独自の関数を定義していきます。 エクスポート関数 "GetFileDlg" を作る この関数では、「ファイルを開く」「ファイルの保存」ダイアログボックスを表示します。OPENFILENAME構造体の内容を共有する形で、GetOpenFileName関数、GetSaveFileName関数を呼び出します。ユーザーがファイルを選択すると1が、キャンセルすると0が返るようにします。 Function Export GetFileDlg(hWnd As Long, lpBuf As BytePtr, lpFilter As BytePtr, bOpen As Long) As Long Dim ofn As OPENFILENAME 'OPENFILENAME構造体の初期化 FillMemory(VarPtr(ofn),Len(ofn),0) ofn.lStructSize=Len(ofn) ofn.hwndOwner=hWnd SetDWord(VarPtr(ofn.lpstrFilter),lpFilter) ofn.nFilterIndex=1 SetDWord(VarPtr(ofn.lpstrFile),lpBuf) ofn.nMaxFile=MAX_PATH ofn.Flags=OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST ofn.lpstrDefExt="*" If bOpen Then ofn.lpstrTitle="ファイルを開く" '「ファイルを開く」ダイアログ ボックスを表示 If GetOpenFileName(ofn)=0 Then GetFileDlg=0 Exit Sub End If Else ofn.lpstrTitle="ファイルの保存" '「ファイルの保存」ダイアログ ボックスを表示 If GetSaveFileName(ofn)=0 Then GetFileDlg=0 Exit Sub End If End If GetFileDlg=1End Function エクスポート関数 "GetFolderDlg" を作る SHBrowseForFolder関数、SHGetPathFromIDList関数を初めて目にした方がほとんどでしょう。SHBrowseForFolder関数で「フォルダの参照」ダイアログボックスを表示し、ユーザーがOKボタンを押すとSHGetPathFromIDList関数でフォルダへのパスを取得する流れになっています。ユーザーがフォルダを選択すると1が、キャンセルボタンを押すと0が返るようにします。 Function Export GetFolderDlg(hWnd As Long, lpFolder As BytePtr) As Long Dim bi As BROWSEINFO Dim pidlBrowse As VoidPtr 'BROWSEINFO構造体の初期化 FillMemory(VarPtr(bi),Len(bi),0) bi.hwndOwner=hWnd bi.lpszTitle="フォルダの選択" bi.ulFlags=BIF_RETURNONLYFSDIRS '「フォルダの参照」ダイアログボックスを表示 pidlBrowse=SHBrowseForFolder(bi) If pidlBrowse Then 'フォルダへのパスを取得(lpFolderポインタが示すバッファにコピー) SHGetPathFromIDList(pidlBrowse, lpFolder) GetFolderDlg=1 Else GetFolderDlg=0 End IfEnd Function DLL内のプログラムはこれですべてです。コンパイルが正常に行われると、"FileDlg.dll" というファイルが生成されるはずです。 "FileDlg.dll" を作ったはいいが、どうやって使うの? ということで、DLL呼び出しのサンプル プログラムを作ってみましょう。ProjectEditorの新規作成でBasicプログラムを選択し、以下のソースコードを入力します。コンパイル前に、"test.abp" などというファイル名でFileDlgプロジェクトのディレクトリに保存しておきましょう。 Declare Function GetFileDlg Lib "FileDlg" ( hWnd As Long, lpBuf As BytePtr, lpFilter As BytePtr, bOpen As Long) As LongDeclare Function GetFolderDlg Lib "FileDlg" ( hWnd As Long, lpFolder As BytePtr) As LongDim i As LongDim buf As StringDim FileFilter As Stringbuf=ZeroString(MAX_PATH)FileFilter="すべてのファイル(*.*)" + Chr$(0) + "*" + Chr$(0)'開くダイアログを表示i=GetFileDlg(0, _ StrPtr(buf), _ StrPtr(FileFilter), _ 1)If i Then MessageBox(0,buf,"「ファイルを開く」で選択されたファイル",MB_OK)Else MessageBox(0,"ファイルは選択されませんでした","エラー",MB_OK)End If'保存ダイアログを表示i=GetFileDlg(0, _ StrPtr(buf), _ StrPtr(FileFilter), _ 0)If i Then MessageBox(0,buf,"「ファイルの保存」で選択されたファイル",MB_OK)Else MessageBox(0,"ファイルは選択されませんでした","エラー",MB_OK)End If'「フォルダの参照」ダイアログを表示i=GetFolderDlg(0,StrPtr(buf))If i Then MessageBox(0,buf,"「ファイルの参照」で選択されたフォルダ",MB_OK)Else MessageBox(0,"フォルダは選択されませんでした","エラー",MB_OK)End IfExitProcess(0) 上のプログラムでわかるとおり、Win32APIの関数を定義したことがある方なら、自作DLL内の関数の定義、呼び出しは朝飯前ですね!? DLL作成は初めてだったというかたはどうだったでしょうか?今回作成したFileDlg.dllは、意外と便利なDLLなので、テキスト エディタ プログラムなどで採用してみるのも良いかもしれません。
https://w.atwiki.jp/suffix/pages/310.html
checkボックスのON,OFF状態はcheckedプロパティで調べることができる。 従って、checkboxのオブジェクト.checked = trueならチェックボックスに チェックされている状態、falseならされていない状態ということになる。 form name ="Form" input type ="checkbox" /form というケースであれば、 document.Form.elments[0].checkedがそれにあたる。 例えば複数のチェックボックスから、 チェックが入ったチェックボックスを知りたい場合は 以下のようになる。 var elements = document.getElementsByName("sample"); for(var i = 0; i elements.length; i++) { if(elements[i].checked) { //チェックボックスが入った要素の処理を記述 } } フォームなどでサーバー側に送信していて、そちら側でどういった形で 値が受け取られているかを調べるには、PHPなどサーバー側で var_dump($REQUEST); といった形で表示してしまうのが分かりやすい。 ちなみに、チェックが入っているときには"on"という値が格納される。 ただし、value="sample"みたいな形で指定してある場合には その値が格納される。 例: input type="checkbox" name="sample[a]" value="Adayo" 項目A br input type="checkbox" name="sample[b]" value="Bdayo" 項目B br input type="checkbox" name="test" テスト br ですべての項目にチェックが入っていたのなら、 $_POST[ sample ][ a ]→"Adayo",$_POST[ sample ][ b ]→"Bdayo",$_POST[ test ]→"on"が 格納されていることになる。
https://w.atwiki.jp/ryo4649/pages/23.html
工事中
https://w.atwiki.jp/abwiki/pages/256.html
Basicで文字列といったら、$マークをくっつけた変数や、String型で定義した変数を利用するんじゃ… おっしゃる通り、以前までのBasicでは文字列といえば、String型変数でした。 しかしこのString型変数、扱いはとても簡単ですが、落とし穴もあります。難しい話になってしまいますが、文字列バッファ用のメモリを確保したり、解放したりする処理を独自に行っているため、Win32API用をはじめとするいくつかの機能はこれらメモリ操作のことを考慮してくれません。String型変数は、独自のプログラム内でのみの利用ならなんの問題もありませんが、Windowsアプリケーションの開発を行っていく上で、どうしても無理が生じる場合があります。 そこで登場するのか、Byte配列の変数。メモリ確保、解放などの処理が必要ないため、比較的単純な構造をしています。こちらもコツさえつかんでしまえば、扱いはとても簡単です。C言語を経験したことがあるかたなら、以下のプログラムが同等のものであるといえば、一発で理解できるでしょう。 Dim a[100-1] As Byte イコール char a[100]; ActiveBasicでは、Win32APIなどを通し、Windowsアプリケーション開発を行う場合は、なるべくByte配列を利用することを推奨します。ここから以下は、Byte配列の変数を利用した文字列操作の方法を紹介します。 Byte配列のデータ構造 Byte配列の文字列は、定義した範囲内の長さを持つ、 NULL終端の非常にシンプルな構造をしています。NULLとは、文字コード0のデータのことを意味します。 通常、配列変数のデータを扱うときは a[0]、a[1] などというように、変数名の後にカッコをつけ、任意の配列要素を指定します。文字列内の任意の文字を扱うときはこの表記方法を用いますが、文字列の先頭ポインタを扱うときは、変数名だけを指定することがあります。少しややこしい話になりますが、以下の2つの意味は同じになります。 a イコール VarPtr(a[0]) 文字列のコピー Dim FilePath[255] As ByteDim path2[255] As Bytelstrcpy(FilePath,"C \My Document\hp\index.html")lstrcpy(path2,FilePath)MessageBox(0,path2,"文字列テスト",MB_OK) 先頭の2行のDim命令で、256バイトずつ(合計512バイト)文字列用のバッファを定義しています。 次に、FilePath配列に、"C \My Document\hp\index.html" という文字列をコピーし、更にそれをpath2配列にコピーしているのがわかります。このように、lstrcpy関数を利用すれば、Byte配列同士、文字列のコピーを行うことができます。 lstrcpy(コピー先のバッファポインタ, コピー元のバッファポインタ) Byte配列に対して、a="ABCDEFG" や、a=a+b などといった演算はできないので、慣れるまでは注意しましょう。 文字列の連結 試しに、馴染みの深いString型変数を利用して文字列連結の操作を行ってみましょう。 Dim a As StringDim b As Stringa="ABCDEFG"b="1234567"a=a+bMessageBox(0,a,"test",MB_OK) これと同じ動作をByte配列を用いて再現すると、以下のようなプログラムに書き換えることができます。 Dim a[255] As ByteDim b[255] As Byte'文字列をセットlstrcpy(a,"ABCDEFG")lstrcpy(b,"1234567")'文字列aに文字列bを連結させるlstrcat(a,b)MessageBox(0,a,"文字列テスト",MB_OK) lstrcatは、文字列連結のための関数であり、以下のようなパラメータを持ちます。 lstrcat(連結先文字列, コピー元文字列) 文字列の消去 任意の個所の文字列を消去するのは、Byte配列の得意分野かもしれません。 Dim a[100] As Byte'文字列をセットlstrcpy(a,"ABCDEFG1234567")'後半の数値部分を削除a[7]=0MessageBox(0,a,"文字列テスト",MB_OK) 上のプログラムのように、消去したい文字列を示す位置に0を入れるだけで実現できます。この0というのは、一般的に、NULL文字と呼ばれるもので、文字列の終端部分を表すときに用いられます。 BytePtr型の変数 BytePtr型変数とは、Byte配列の先頭ポインタを管理する変数のことを指します。先頭ポインタの変更ができる点を除けば、Byte配列と扱い方は変わりません。 Dim FilePath[100] As ByteDim pBuf As BytePtr'文字列をコピーlstrcpy(FilePath,"C \My Document\hp\index.html")'FilePathの先頭ポインタをpBufに格納pBuf=FilePath' ファイル名"index.html"を消去pBuf[17]=0MessageBox(0,pBuf,"文字列テスト",MB_OK)